/*********************************************************************************
*  Seg 2501, hiver 2002 Devoir # 4
*
*  fichier Banque.java
*  contrôlleur du simulateur et
*  calcule des statistiques
*
*  @author  Anne Bertrand
*  @author  Robin Tropper
*  @refactoredBy Robin Tropper  B.Sc.A.
*  
*  BOGUE : il arrivait (passé) parfois que les caissières ne voyaient pas que
*  la banque "est fermée" => résultat: boucle infinie lorsque la caissière cherche
*  le prochain client.
*  => DEVRAIT être réglé, mais difficile à prouver formellement. 
*
**********************************************************************************/

import java.util.*;

public class Banque {

 	private static int nombreCaisses = 3;
 	private static long duree = 3600;
 	
 	private static boolean heureDeCloture = false;

 	static Timer fini = new Timer();	//temps limite pour l'exécution du programme entier
	static FileClient fileEntr = new FileClient(300,100,fini,duree, " Entreprise");
	static FileClient fileIndiv = new FileClient(50,50,fini,duree," Individu");

	/**
	 * Par défaut, il n'y a qu'une file pour entreprises et une file
	 * pour individus. Cette méthode a pour but de favoriser l'extensibilité
	 * dans le cas où multiples files à multiples priorités viendraient.
	 * 
	 * @return : la liste des files d'attente en ordre descendant de priorité.
	 * En d'autres mots, parcourir la liste assure le respect des priorités.
	 */
	public static synchronized List<FileClient> montreFiles(){
		List<FileClient> listeFiles = new ArrayList<FileClient>();
		listeFiles.add(0, fileEntr);
		listeFiles.add(1, fileIndiv);
		return listeFiles;
	}//fin montreFiles
	
	public static boolean getCloture(){
		return heureDeCloture;
	}//fin getCloture
	
//#####
// main
//#####
	public static void main(String[] args) {
		System.out.println("Simulation pour "+nombreCaisses+" caissiï¿½res sur "+
								duree/600+" heures.");
		System.out.println("Veuillez patienter "+duree/600+
											" secondes pour les rï¿½sultats");
		fini.schedule(new Terminer(), duree);
		ThreadGroup caisseGroup = new ThreadGroup("caisseGroup");
		Caissiere caisse;
		System.out.println("NOMBRE CAISSES "+nombreCaisses);
		for (int k=0; k<nombreCaisses; k++) {
			caisse = new Caissiere(fini, k);
		}
	}//fin du main

	static class Terminer extends TimerTask{
  		public void run(){
  			heureDeCloture = true;
  			fini.cancel();//arrêter tous les autres objets qui l'utilisent

  			long EntAtt = fileEntr.SizeFile();			//Entreprises non-servis
	  		long IndAtt = fileIndiv.SizeFile();			//Individus non-servis
	  		long tEntr = fileEntr.Temps();				//en milli-secondes
	  		long tIndiv = fileIndiv.Temps();			//en milli-secondes
			long entrServis = fileEntr.getClientsServis();	//Entreprises servis
			long indivServis = fileIndiv.getClientsServis();	//Individus servis
			long entrVenus = EntAtt+entrServis;
			long indivVenus = IndAtt+indivServis;
			long servisTotal = entrServis+indivServis;
			long clientsTotal = servisTotal+EntAtt+IndAtt;
			long EntMoyAtt=0;
			long IndMoyAtt=0;
	  		System.out.println("\n"+clientsTotal+"Visiteurs au total.");
	  		System.out.println(nombreCaisses+" Caisses pour les servir.\n");
	  		System.out.println(entrVenus+" entreprises se sont présentées.");
	  		System.out.println(indivVenus+" individus se sont présentées.");
	  		System.out.println("Entreprises non-servis :" + EntAtt);
	  		System.out.println("Individus non-servis :" + IndAtt);
			System.out.println("\nClients total servis: "+clientsTotal);
			System.out.println("Entreprises servis: "+entrServis);
			System.out.println("Individus servis: "+indivServis);
			if ((EntMoyAtt=fileEntr.getMoyAttente())!=0) {
				System.out.println("\nMoyenne d'attente pour les entreprises "+
										EntMoyAtt/10+" minutes");
			} else { System.out.println("Aucune Entreprise servie.");}
			if ((IndMoyAtt=fileIndiv.getMoyAttente())!=0) {
				System.out.println("Moyenne d'attente pour les individus "+
										IndMoyAtt/10+" minutes\n");
			} else { System.out.println("Aucun Individu servi.");}
	  		System.exit(0);
  		}//fin du run
  	}//fin du TimerTask

}//fin de la classe Banque